/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.context;

import com.context.properties.AplicacionProperties;
import com.context.properties.EnahoProperties;
import com.context.job.CargaAutomaticaJob;
import com.context.properties.ContextProperties;
import com.model.service.ConfiguracionService;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.util.Date;
import java.util.Properties;
import org.quartz.SchedulerException;
import util.date.DateUtil;
import util.PropertiesUtil;
import util.file.FileUtil;
import util.www.jdbc.JdbcProperties;
import util.log.MiLogger;

/**
 * OJO: El contexto se está creando la primera vez que es llamado
 * @author Rdelacruz
 */
public class AppContext {
    
    //----------------------------------------------------------
    //Implementando el patron SINGLETON, es decir que esta clase pueda crear
    //una sola intancia.    
    
    private static AppContext instancia = null;
        
    public static AppContext getInstancia() {
        if(instancia==null) {
            instancia = new AppContext();
        }
        return instancia;
    }
    
    
    
    //-------------------------------------------------------
    
    private final String version = "1.4.7";//aquí se cambia la versión
    
    private final ControllerMapping controllerMapping;
    private final ControllerContext controllerContext;
    private final ModelContext modelContext;
    private final AplicacionProperties aplicacionProperties;
    private final EnahoProperties enahoProperties;
    private final JdbcProperties jdbcProperties;
    private final ContextProperties contextProperties;
    private final CargaAutomaticaJob cargaAutomaticaJob;
    private final LoggerContext loggerContext;
    
    public static String getVersion() {
        return getInstancia().getAplicacionProperties().getVersion();
    }
    
    //Esto se ejecuta solo la primera vez
    private AppContext() {        
        System.out.println("AppContext()");        
        
        modelContext = new ModelContext();
        controllerContext = new ControllerContext();
        controllerMapping = new ControllerMapping();
        aplicacionProperties = new AplicacionProperties();
        contextProperties = new ContextProperties();
        cargaAutomaticaJob = new CargaAutomaticaJob(); 
        loggerContext = new LoggerContext();
        
        //Solo se lee la primera vez
        //jdbcProperties = JdbcUtil.getInstancia(aplicacionProperties.getRutaJdbcProperties());
        
        //Se lee cada vez que getJdbcProperties() es llamado 
        jdbcProperties = new JdbcProperties();
        
        //Se lee cada vez que getEnahoProperties() es llamado 
        enahoProperties = new EnahoProperties();
    }
    
    private void testAccesoCarpetaCompartida() throws FileNotFoundException {
        //TEST: Si se tiene permiso de escritura sobre 
        String ruta = "/mnt/windows";
        Date d = new Date();
        String sufijo = DateUtil.DateToString(d,DateUtil.dateFormatSufijoFechaHora);
        FileUtil.escribirArchivo(ruta+"/deploy_"+sufijo+".txt",d.toString());
    }
    
    public void inicializar() throws Exception {        
        testAccesoCarpetaCompartida(); 
            
                        
        aplicacionProperties.setVersion(version);
        
        File directorioSenhuelo = new File("c:/EnahoWeb");//Directorio señuelo
        if(directorioSenhuelo.exists()) {//si el directorio existe
            aplicacionProperties.setRuta("com/context/properties");//MODO DESARROLLO
            aplicacionProperties.setEnProduccion(false);
            MiLogger.getProperties().setImprimirEnConsola(true);
        }
        else {
            aplicacionProperties.setRuta("");//MODO PRODUCCION
            aplicacionProperties.setEnProduccion(true);
            MiLogger.getProperties().setImprimirEnConsola(false);
        }        
               
        loggerContext.inicializar();       
        cargaAutomaticaJob.iniciar();      
        
        
        //////////////////////////
        
        controllerContext.setAppContext(this);
        controllerMapping.setControllerContext(controllerContext);
        
        modelContext.inicializar();           
        controllerContext.inicializar();
        controllerMapping.inicializar();
         
    }
    
    public void finalizar() throws SchedulerException {
        cargaAutomaticaJob.detener();
        loggerContext.finalizar();
    }
    
    

    public ControllerContext getControllerContext() {
        return controllerContext;
    }   
    
    public AplicacionProperties getAplicacionProperties() {
        return aplicacionProperties;
    }

    public EnahoProperties getEnahoProperties(Connection con) throws Exception { //throws IOException {        
        if(aplicacionProperties.isEnProduccion()) {
            //Nota: Borré el "enaho.properties", porque se leeran los datos de la base de datos
            ConfiguracionService service = this.modelContext.getConfiguracionService();
            enahoProperties.setAnho(service.findPropertyByCodigo(con, "enaho.anho"));
            enahoProperties.setDirectorio_upload(service.findPropertyByCodigo(con,"enaho.directorio_upload"));
            enahoProperties.setDirectorio_upload_copia(service.findPropertyByCodigo(con, "enaho.directorio_upload_copia"));
        }
        else {
            Properties p = PropertiesUtil.getPropertiesSinBackSlash(aplicacionProperties.getRutaEnahoProperties());
            enahoProperties.setAnho(p.getProperty("enaho.anho"));
            enahoProperties.setDirectorio_upload(p.getProperty("enaho.directorio_upload"));
            enahoProperties.setDirectorio_upload_copia(p.getProperty("enaho.directorio_upload_copia"));
        }
        return enahoProperties;
    }
    
    public ContextProperties getContextProperties() throws IOException{
        Properties p;        
        p = PropertiesUtil.getPropertiesSinBackSlash(aplicacionProperties.getRutaContextProperties());        
        contextProperties.setDirectorio_log(p.getProperty("directorio_log"));        
        return contextProperties;
    }

    public JdbcProperties getJdbcProperties() throws IOException {
        Properties p = PropertiesUtil.getProperties(aplicacionProperties.getRutaJdbcProperties());
        jdbcProperties.setUrl(p.getProperty("jdbc.url"));
        jdbcProperties.setDriver(p.getProperty("jdbc.driver"));
        jdbcProperties.setUsername(p.getProperty("jdbc.username"));
        jdbcProperties.setPassword(p.getProperty("jdbc.password"));
        return jdbcProperties;
    }

    public CargaAutomaticaJob getCargaAutomaticaJob() {
        return cargaAutomaticaJob;
    }

    public LoggerContext getLoggerContext() {
        return loggerContext;
    }

    public ModelContext getModelContext() {
        return modelContext;
    }

    public ControllerMapping getControllerMapping() {
        return controllerMapping;
    }

    
    
    
}
